/**
 * @file LyricUi.h
 * @brief 歌词显示UI相关类和函数定义
 * @details 负责歌词的界面展示、滚动同步和用户交互处理
 */
#ifndef LYRIC_UI_H
#define LYRIC_UI_H

#include <gtk/gtk.h>
#include "LyricTool.h"

/**
 * @struct LyricWidget
 * @brief 歌词显示控件结构体
 * @details 包含歌词显示所需的所有UI元素和状态信息
 * @var LyricWidget::title_label 歌曲标题标签
 * @var LyricWidget::lyric_container 歌词容器
 * @var LyricWidget::lyric_view 歌词文本视图
 * @var LyricWidget::lyric_buffer 歌词文本缓冲区
 * @var LyricWidget::title 歌曲标题
 * @var LyricWidget::artist 歌手名称
 * @var LyricWidget::location 歌曲位置
 * @var LyricWidget::lyrics 歌词行列表
 * @var LyricWidget::current_line 当前播放行索引
 * @var LyricWidget::past_line 上一行歌词
 * @var LyricWidget::get_position 获取当前播放位置的回调函数
 * @var LyricWidget::timer_id 定时器ID
 * @var LyricWidget::mutex 互斥锁，保护并发访问
 */
typedef struct {
    GtkWidget* title_label;
    GtkWidget* lyric_container;
    GtkWidget* lyric_view;
    GtkTextBuffer* lyric_buffer;
    gchar title[256];
    gchar artist[256];
    gchar location[1024];
    GList* lyrics; // 每行歌词结构体
    gint current_line;
	LyricLine* past_line;

    float (*get_position) (gpointer user_data);
    guint timer_id;
    GMutex mutex;
    gint global_sequence; // 全局播放计数器，每次切歌时自动加1
} LyricWidget;

// 用于在UI线程中更新歌词面板的数据结构
typedef struct {
	LyricWidget* widget;
	gchar title[256];
	gchar artist[256];
	gchar location[1024];
    gint song_seq;
    GList* lyrics_temp; // 临时歌词行列表
} SetLyricsUIData;

/**
 * @brief 释放SetLyricsUIData结构体中的资源
 * @param data SetLyricsUIData结构体指针
 */
void free_set_lyrics_ui_data(SetLyricsUIData* data);

/**
 * @brief 获取文本视图中可见的行数
 * @param text_view GTK文本视图对象
 * @param pixels_above 顶部留出像素数
 * @param pixels_below 底部留出像素数
 * @return 可见行数
 */
int get_visible_line_count(GtkTextView* text_view, gint pixels_above, gint pixels_below);

/**
 * @brief 确保指定迭代器位置的文本在视图中居中显示
 * @param text_view GTK文本视图对象
 * @param iter 文本迭代器，指向要居中显示的文本位置
 */
void ensure_centered(GtkTextView* text_view, GtkTextIter* iter);

/********* UI *********/

/**
 * @brief 创建新的歌词显示控件
 * @return 新创建的LyricWidget对象指针
 */
LyricWidget* lyric_widget_new();

/**
 * @brief 设置菜单项激活回调函数
 * @param item GTK菜单项
 * @param user_data 用户数据，通常为LyricWidget指针
 */
void on_settings_activate(GtkMenuItem* item, gpointer user_data);

/**
 * @brief 搜索菜单项激活回调函数
 * @param item GTK菜单项
 * @param user_data 用户数据，通常为LyricWidget指针
 */
void on_search_activate(GtkMenuItem* item, gpointer user_data);

/**
 * @brief 编辑菜单项激活回调函数
 * @param item GTK菜单项
 * @param user_data 用户数据，通常为LyricWidget指针
 */
void on_edit_activate(GtkMenuItem* item, gpointer user_data);

/**
 * @brief 填充上下文菜单回调函数
 * @param text_view GTK文本视图对象
 * @param menu 上下文菜单对象
 * @param user_data 用户数据，通常为LyricWidget指针
 */
void on_populate_popup(GtkTextView* text_view, GtkMenu* menu, gpointer user_data);

/**
 * @brief 处理按钮按下事件，防止双击崩溃
 * @param widget GTK窗口组件
 * @param event 按钮事件
 * @param user_data 用户数据，通常为LyricWidget指针
 * @return TRUE表示事件已处理，FALSE表示继续传播
 */
gboolean on_button_press_event(GtkWidget* widget, GdkEventButton* event, gpointer user_data);

/******** public ********/

/**
 * @brief 清除歌词控件内容
 * @param widget LyricWidget对象指针
 */
void clear_widget(LyricWidget* widget);

/**
 * @brief 设置歌词内容
 * @param data 歌词UI数据结构体指针
 */
void set_lyrics(SetLyricsUIData* data);

/**
 * @brief 获取全局播放计数器
 * @return 当前全局播放计数器值
 */
gint get_current_sequence(void);
/**
 * @brief 获取全局播放计数器
 * @return 当前全局播放计数器值
 */
 gint get_next_sequence(void);

/******** private ********/

/**
 * @brief 释放歌词行列表资源
 * @param pplines 歌词行列表指针的指针
 */
void free_lines(GList** pplines);

/**
 * @brief 拷贝歌词行列表资源
 * @param plines 歌词行列表指针的指针
 */
GList* copy_lines(GList* plines);

/**
 * @brief 更新歌词显示
 * @param widget LyricWidget对象指针
 * @param current_time_ms 当前播放时间（毫秒）
 */
void update_lyrics(LyricWidget* widget, gdouble current_time_ms);

/**
 * @brief 启动歌词同步计时器
 * @param widget LyricWidget对象指针
 */
void start_time(LyricWidget* widget);

/**
 * @brief 初始化歌词内容
 * @param widget LyricWidget对象指针
 * @param title 歌曲标题
 * @param artist 歌手名称
 * @param lines 歌词行列表
 */
void init_lyric(LyricWidget* widget, const gchar* title, const gchar* artist, GList* lines);

/**
 * @brief 初始化歌词的事件处理函数
 * @param data 用户数据，通常为LyricWidget指针
 * @return 处理结果，TRUE表示继续处理，FALSE表示停止处理
 */
gboolean init_lyric_handle(gpointer data);
#endif
